home *** CD-ROM | disk | FTP | other *** search
- /* help for debugging, use special ttp.s */
-
- #define super(stk) trap(1, 0x20, stk)
-
- struct dump {
- long magic;
- long data[8];
- long addr[8];
- long pc;
- long usp;
- int stk[4];
- int status;
- long upc;
- int more[8];
- } d;
-
- struct header {
- short magic;
- long text;
- long data;
- long bss;
- long sym;
- long rsvd0;
- long rsvd1;
- short rsvd2;
- } h;
-
- struct sym {
- char name[8];
- short type;
- long value;
- } s;
-
- long tpa, upc;
-
- main(argc, argv) char *argv[]; {
- extern long *_estk;
- printf("tpa=%lx\n", tpa = *_estk);
- getdump();
- showdump();
- if (argc > 1)
- getfnc(argv[1], upc - (tpa + 0x100));
- }
-
- getdump() {
- long stk;
- char *src, *dst;
- int sz;
- stk = super(0L);
- mcopy(&d, 0x380L, sizeof d);
- super(stk);
- }
-
- showdump() {
- int i;
- long n;
- if (d.magic != 0x12345678) {
- printf("no dump available\n");
- return;
- }
- printf("exception #%d\n", (short)(d.pc >> 24));
- printf(" data address\n");
- for (i = 0; i < 8; i++)
- printf("%d: %8lx %8lx\n", i, d.data[i], d.addr[i]);
- printf("pc=%lx usp=%lx upc=%lx\n",
- d.pc & 0xFFFFFF, d.usp, upc = d.upc);
- }
-
- getfnc(name, pc) char *name; long pc; {
- int fd;
- long n, lseek();
- struct sym fnc;
- if ((fd = open(name, 0)) < 0)
- printf("can't open %s\n", name);
- else if (read(fd, &h, sizeof h) != sizeof h)
- printf("can't read header of %s\n", name);
- else if (h.sym == 0L)
- printf("no symbols in %s\n", name);
- else if (lseek(fd, h.text+h.data, 1) < 0L)
- printf("premature EOF on %s\n", name);
- else {
- *fnc.name = 0;
- fnc.value = 0;
- for (n = h.sym; n > 0; n -= sizeof s) {
- read(fd, &s, sizeof s);
- if (s.value > fnc.value && s.value <= pc)
- mcopy(&fnc, &s, sizeof fnc);
- }
- printf("bug at %ld words after '%s'\n",
- pc - fnc.value, fnc.name);
- }
- }
-
- mcopy(dst, src, sz) char *dst, *src; {
- while (sz--) *dst++ = *src++;
- }
-